package Controladores_Jsf;

import Entidades_Persistencia.Proyecto;
import Controladores_Jsf.util.JsfUtil;
import Controladores_Jsf.util.PaginationHelper;
import Entidades_Persistencia.Departamento;
import Entidades_Persistencia.Empleado;
import Entidades_Persistencia.EstadoProyecto;
import Entidades_Persistencia.EvaluacionProyecto;
import Facades.ProyectoFacade;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.ResourceBundle;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.faces.model.SelectItem;

@ManagedBean(name = "proyectoController")
@SessionScoped
public class ProyectoController implements Serializable {

    private Proyecto current;
    private DataModel items = null;
    
    private List proyectosEval;
    private List proyectosConsultaEmpleado;
    private int codEval;
    private boolean calificable;
    private boolean editable;
    private Empleado empleado;
    @EJB
    private Facades.EstadoProyectoFacade facadeEstado;
    @EJB
    private Facades.EmpleadoFacade EmpleadoFacade;
    
    @EJB
    private Facades.ProyectoFacade ejbFacade;
    private PaginationHelper pagination;
    private int selectedItemIndex;
    private String criterioBusqueda;
    private String nombreBusqueda;
    private Departamento departamento;
    private boolean desplegable;
    private List proyectosConsulta;
    public ProyectoController() {
    }

    public Proyecto getSelected() {
        if (current == null) {
            current = new Proyecto();
            selectedItemIndex = -1;
        }
        return current;
    }

    private ProyectoFacade getFacade() {
        return ejbFacade;
    }

    public PaginationHelper getPagination() {
        if (pagination == null) {
            pagination = new PaginationHelper(10) {

                @Override
                public int getItemsCount() {
                    return getFacade().count();
                }

                @Override
                public DataModel createPageDataModel() {
                    return new ListDataModel(getFacade().findRange(new int[]{getPageFirstItem(), getPageFirstItem() + getPageSize()}));
                }
            };
        }
        return pagination;
    }

    public String prepareList() {
        recreateModel();
        return "List";
    }

    public String prepareView() {
        current = (Proyecto) getItems().getRowData();
        selectedItemIndex = pagination.getPageFirstItem() + getItems().getRowIndex();
        return "View";
    }

    public String prepareCreate() {
        current = new Proyecto();
        selectedItemIndex = -1;
        return "Create";
    }
    
    public EstadoProyecto getEstado() {
        EstadoProyecto estado = (EstadoProyecto) facadeEstado.findByCod(1).get(0);
        return estado;
    }

    public Empleado getEmpleado(){
        int tmp = (Integer)findBean("sesiones.codigo");
        System.out.print(tmp);
        empleado = (Empleado) EmpleadoFacade.findByCod(tmp).get(0);
        return empleado;
    }

    public String create() {
        try {
            current.setCodigoEstado(getEstado());
            current.setResponsable(getEmpleado());
            current.setDepartamento(empleado.getCodigoDepartamento());
            
            Date registro =new Date();
            current.setFechaRegistro(registro);
            current.setFechaActualizacion(registro);
            
            getFacade().create(current);
            JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/Bundle").getString("ProyectoCreated"));
            return prepareCreate();
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
            return null;
        }
    }

    public String prepareEdit() {
        current = (Proyecto) getItems().getRowData();
        selectedItemIndex = pagination.getPageFirstItem() + getItems().getRowIndex();
        return "Edit";
    }

    public String update() {
        try {
            Date actuliza =new Date();
            current.setFechaActualizacion(actuliza);
            getFacade().edit(current);
            JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/Bundle").getString("ProyectoUpdated"));
            return "View";
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
            return null;
        }
    }

    public String destroy() {
        current = (Proyecto) getItems().getRowData();
//        selectedItemIndex = pagination.getPageFirstItem() + getItems().getRowIndex();
        performDestroy();
        recreateModel();
        return "List";
    }

    public String destroyAndView() {
        performDestroy();
        recreateModel();
//        updateCurrentItem();
//        if (selectedItemIndex >= 0) {
//            return "View";
//        } else {
//            // all items were removed - go back to list
//            recreateModel();
//            return "List";
//        }
        return "View";
    }

    private void performDestroy() {
        try {
            current.setCodigoEstado(facadeEstado.find(6));
            getFacade().edit(current);
            JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/Bundle").getString("ProyectoDeleted"));
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
        }
    }

    private void updateCurrentItem() {
        int count = getFacade().count();
        if (selectedItemIndex >= count) {
            // selected index cannot be bigger than number of items:
            selectedItemIndex = count - 1;
            // go to previous page if last page disappeared:
            if (pagination.getPageFirstItem() >= count) {
                pagination.previousPage();
            }
        }
        if (selectedItemIndex >= 0) {
            current = getFacade().findRange(new int[]{selectedItemIndex, selectedItemIndex + 1}).get(0);
        }
    }

    public DataModel getItems() {
        if (items == null) {
            items = getPagination().createPageDataModel();
        }
        return items;
    }

    private void recreateModel() {
        items = null;
    }

    public String next() {
        getPagination().nextPage();
        recreateModel();
        return "List";
    }

    public String previous() {
        getPagination().previousPage();
        recreateModel();
        return "List";
    }

    public SelectItem[] getItemsAvailableSelectMany() {
        return JsfUtil.getSelectItems(ejbFacade.findAll(), false);
    }

    public SelectItem[] getItemsAvailableSelectOne() {
        return JsfUtil.getSelectItems(ejbFacade.findAll(), true);
    }

    @FacesConverter(forClass = Proyecto.class)
    public static class ProyectoControllerConverter implements Converter {

        public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
            if (value == null || value.length() == 0) {
                return null;
            }
            ProyectoController controller = (ProyectoController) facesContext.getApplication().getELResolver().
                    getValue(facesContext.getELContext(), null, "proyectoController");
            return controller.ejbFacade.find(getKey(value));
        }

        java.lang.Integer getKey(String value) {
            java.lang.Integer key;
            key = Integer.valueOf(value);
            return key;
        }

        String getStringKey(java.lang.Integer value) {
            StringBuffer sb = new StringBuffer();
            sb.append(value);
            return sb.toString();
        }

        public String getAsString(FacesContext facesContext, UIComponent component, Object object) {
            if (object == null) {
                return null;
            }
            if (object instanceof Proyecto) {
                Proyecto o = (Proyecto) object;
                return getStringKey(o.getCodigo());
            } else {
                throw new IllegalArgumentException("object " + object + " is of type " + object.getClass().getName() + "; expected type: " + ProyectoController.class.getName());
            }
        }
    }
    
    public void proyEval() {
        codEval=(Integer)findBean("sesiones.codigo");
        proyectosEval=getFacade().buscarProyEval(codEval);
        
    }

    public DataModel getProyectosEval() {
        proyEval();
        items=new ListDataModel(proyectosEval);
        return items;
    }

    public int getCodEval() {
        return codEval;
    }

    public void setCodEval(int codEval) {
        this.codEval = codEval;
    }
    
    @SuppressWarnings("unchecked")
    public static <T> Object findBean(String beanName) {
        FacesContext context = FacesContext.getCurrentInstance();
        return context.getApplication().evaluateExpressionGet(context, "#{" + beanName + "}", Object.class);
    }

    public boolean getCalificable() {
        EvaluacionProyecto tmp= current.getEvaluacionProyectoList().get(0);
        Date limite=tmp.getTiempoLimite();
        Date hoy=new Date();
        
        if((current.getCodigoEstado().getCodigo()!=2) && (hoy.after(limite)))calificable=false;
        else calificable=true;
        return calificable;
    }
    
    public boolean getEditable(){
        
        if(current.getCodigoEstado().getCodigo()==1){
            editable= true;
        }
        else editable=false;
            
            
      return editable;
    }
    
    
    public boolean getDesplegable(){
        
        if(current.getCodigoEstado().getCodigo()==7){
            desplegable= false;
        }
        else desplegable=true;
            
            
      return desplegable;
    }
    
    public void setCriterioBusqueda(String criterioBusqueda){
    
      this.criterioBusqueda=criterioBusqueda;
    }
    
    public String getCriterioBusqueda(){
    
    return criterioBusqueda;
    }

    public void setNombreBusqueda(String nombreBusqueda) {
        this.nombreBusqueda = nombreBusqueda;
    }
    
    public String getNombreBusqueda(){
    
    return nombreBusqueda;
    }

    public void setDepartamento(Departamento departamento) {
        this.departamento = departamento;
    }

    public Departamento getDepartamento() {
        return departamento;
    }

    
    
    
    
    
    public String ConsultarOtrosEmpleado(){
      
                                
        if(criterioBusqueda.equals("nombre_proyecto")){

             proyectosConsultaEmpleado=getFacade().buscarProyEmpleadoNombreProy(nombreBusqueda);
        }
        
        else         
        if(criterioBusqueda.equals("departamento")){
             proyectosConsultaEmpleado=getFacade().buscarProyEmpleadoDepartamentoProy(departamento.getCodigo());
             System.out.print("Entre");
        }
        
        else         
        if(criterioBusqueda.equals("persona_q_creo_proyecto")){
         
            proyectosConsultaEmpleado=getFacade().buscarProyEmpleadoResponsableProy(nombreBusqueda);
        }
            items=new ListDataModel(proyectosConsultaEmpleado);
            return "/Persona/empleado/proyecto/ResultadoBusquedaOtros";
    
    }
    
    
    public String ConsultarPropiosEmpleado(){
      
                                
        if(criterioBusqueda.equals("nombre_proyecto")){

             proyectosConsultaEmpleado=getFacade().buscarProyPropios(nombreBusqueda, (Integer)findBean("sesiones.codigo"));
        }
        
        else         
        if(criterioBusqueda.equals("listar_todos")){
             proyectosConsultaEmpleado=getFacade().ProyectosEmpleado( (Integer)findBean("sesiones.codigo"));
        }
       
            items=new ListDataModel(proyectosConsultaEmpleado);
            return "/Persona/empleado/proyecto/ResultadoBusquedaPropios";
    
    }
        
    
    
    
    public String ConsultarJefeID(){
      
                                
        if(criterioBusqueda.equals("nombre_proyecto")){

             proyectosConsultaEmpleado=getFacade().buscarProyJefeIDNombreProy(nombreBusqueda);
        }
        
        else         
        if(criterioBusqueda.equals("departamento")){
             proyectosConsultaEmpleado=getFacade().ProyectosJefeID(departamento.getCodigo());
             System.out.print("Entre");
        }
        
        else         
        if(criterioBusqueda.equals("persona_q_creo_proyecto")){
         
            proyectosConsultaEmpleado=getFacade().buscarProyJefeIDResponsableProy(nombreBusqueda);
        }
            items=new ListDataModel(proyectosConsultaEmpleado);
            return "ResultadoBusquedaJefeID";
    
    }
    
    
      public String ConsultarJefeDepartamento(){
      
                             
        if(criterioBusqueda.equals("nombre_proyecto")){

             proyectosConsulta=getFacade().buscarProyJefeDepartamentoNombreProy(nombreBusqueda,getEmpleado().getCodigoDepartamento().getCodigo());
        }
              
        else         
        if(criterioBusqueda.equals("persona_q_creo_proyecto")){
         
            proyectosConsulta=getFacade().buscarProyJefeDepartamentoResponsableProy(nombreBusqueda,getEmpleado().getCodigoDepartamento().getCodigo());
        }
            items=new ListDataModel(proyectosConsulta);
            return "List";
    
    }
     
     
      public String ListarDepartamentoJefe(){
       
      proyectosConsulta=getFacade().ProyectosJefeDepartamento(getEmpleado().getCodigoDepartamento().getCodigo());
           
      items=new ListDataModel(proyectosConsulta);
            return "List";
     }
}